
//给定一个链表的头节点  head ，返回链表开始入环的第一个节点。 如果链表无环，则返回 null。
//如果链表中有某个节点，可以通过连续跟踪 next 指针再次到达，则链表中存在环。
//为了表示给定链表中的环，评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置（索引从 0 开始）。
//如果 pos 是 - 1，则在该链表中没有环。注意：pos 不作为参数进行传递，
//仅仅是为了标识链表的实际情况。typedef struct ListNode ListNode;

//方法一从快慢指针处断开，将题目变为求交叉链表的交点。
ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {
    if (headA == NULL || headB == NULL)
    {
        return NULL;
    }
    ListNode* curA = headA;
    ListNode* curB = headB;
    //分别求两个链表的长度
    int lenA = 0;
    int lenB = 0;
    while (curA)
    {
        lenA++;
        curA = curA->next;
    }
    while (curB)
    {
        lenB++;
        curB = curB->next;
    }
    int step = abs(lenA - lenB);
    curA = headA;
    curB = headB;
    if (lenA >= lenB)
    {
        while (step--)
        {
            curA = curA->next;

        }
    }
    else
    {
        while (step--)
        {
            curB = curB->next;
        }
    }

    while (curA)
    {
        if (curA == curB)
        {
            return curA;
        }
        else
        {
            curA = curA->next;
            curB = curB->next;
        }
    }
    return NULL;
}
ListNode* detectCycle(ListNode* head) {
    //找到交点
    if (head == NULL || head->next == NULL)
        return false;
    ListNode* fast = head;
    ListNode* slow = head;
    while (fast)
    {
        if (fast->next)
        {
            fast = fast->next->next;
        }
        else
        {
            break;
        }
        slow = slow->next;
        if (fast == slow)
        {
            //设置新头节点，断开
            ListNode* newhead = NULL;
            newhead = fast->next;
            fast->next = NULL;
            ListNode* curA = head;
            ListNode* curB = newhead;
            ListNode* pos = getIntersectionNode(head, newhead);
            return pos;
        }
    }
    return NULL;
}

//方法二、
typedef struct ListNode ListNode;
ListNode* detectCycle(ListNode* head)
{
    if (head == NULL || head->next == NULL)
        return NULL;
    ListNode* fast = head;
    ListNode* slow = head;
    while (fast && fast->next)
    {
        slow = slow->next;
        fast = fast->next->next;
        if (fast == slow)
            break;
    }
    if (fast == NULL || fast->next == NULL)
        return NULL;

    ListNode* newhead = fast;
    while (head != newhead)
    {
        newhead = newhead->next;
        head = head->next;
    }
    return newhead;
}